import { _decorator, Component, EventMouse, Input, input, Node, Vec3, Animation } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('PlayerController')
export class PlayerController extends Component {

    @property({type: Animation})
    public BodyAnim: Animation | null = null;
    

    // 是否接收到跳跃指令 表示是否开始跳跃
    private _startJump: boolean = false;
    // 跳跃步长
    private _jumpStep: number = 0;
    // 当前跳跃时间
    private _curJumpTime: number = 0;
    // 每次跳跃时长
    private _jumpTime: number = 0.1;
    // 当前跳跃速度
    private _curJumpSpeed: number = 0;
    // 当前角色位置
    private _curPos: Vec3 = new Vec3();
    // 每次跳跃过程中，当前帧移动位置差
    private _deltaPos: Vec3 = new Vec3(0, 0, 0);
    // 目标角色位置 当前位置与步长相加的值 目标位置(_targetPos) = 当前位置(_curPos) + 步长(step)
    private _targetPos: Vec3 = new Vec3();
    private _curMoveIndex = 0; // 记录自己跳了多少步

    start() {
        // input.on(Input.EventType.MOUSE_UP, this.onMouseUp, this); // 监听鼠标输入
    }

    setInputActive(active: boolean) {
        if (active) {
            input.on(Input.EventType.MOUSE_UP, this.onMouseUp, this); // 监听鼠标输入
        } else {
            input.off(Input.EventType.MOUSE_UP, this.onMouseUp, this); // 监听鼠标输入
        }
    }

    // 鼠标事件
    onMouseUp(e: EventMouse) {
        const getButton = e.getButton();
        if (getButton === 0) {
            // 鼠标左键
            this.jumpByStep(1);
        } else if (getButton === 2) {
            // 鼠标右键
            this.jumpByStep(2);
        }
    }

    // step 来表示跳跃几步
    jumpByStep(step: number) {
        if (this._startJump) return;
        this._startJump = true // 表示开始跳跃
        this._jumpStep = step // 本次跳跃的步数
        this._curJumpTime = 0; // 重置下跳跃的时间
        this._curJumpSpeed = this._jumpStep / this._jumpTime; // 计算跳跃的速度
        this.node.getPosition(this._curPos); // 获取角色当前的位置
        Vec3.add(this._targetPos, this._curPos, new Vec3(this._jumpStep, 0, 0)); // add 是将两个向量加起来的方法 意思就是将 当前位置（_curPos） 加上 new Vec3(this._jumpStep, 0, 0) 并得到一个新的向量，而这个向量的结果是存放在 目标位置（_targetPos） 里面

        if (this.BodyAnim) {
            if (step === 1) {
                // 鼠标左键时跳oneStep
                this.BodyAnim.play('oneStep');
            } else if (step === 2) {
                // 鼠标右键时跳动画twoStep
                this.BodyAnim.play('twoStep');
            }
        }

        // 记录跳了几步
        this._curMoveIndex += step;
    }

    onOnceJumpEnd() {
        this.node.emit('JumpEnd', this._curMoveIndex);
    }

    reset() {
        this._curMoveIndex = 0;
    }

    // deltaTime 为帧间隔
    update(deltaTime: number) {
        if (this._startJump) {
            // 如果存在跳跃时 跳跃时间 = 上次的跳跃时间 + 帧间隔
            this._curJumpTime += deltaTime;
            
            if (this._curJumpTime > this._jumpTime) {
                // 跳跃结束 当 _curJumpTime 大于我们提前定义好的 _jumpTime 时，这意味着跳跃结束，
                this.node.setPosition(this._targetPos);  // 强制位移到目标位置
                this._startJump = false; // 标记跳跃结束
                // 每次跳跃结束发出消息
                this.onOnceJumpEnd();
            } else { // 跳跃中
                this.node.getPosition(this._curPos);  // 获取当前的位置 
                this._deltaPos.x = this._curJumpSpeed * deltaTime; // 计算本帧应该位移的长度
                Vec3.add(this._curPos, this._curPos, this._deltaPos); // 将当前位置加上位移的长度
                this.node.setPosition(this._curPos); // 设置位移后的位置
            }
            
        }
    }
}

